const path=require("path");
const Koa=require("koa");
const serve=require("koa-static");
const koaBody=require("koa-body");
const Router=require("koa-router");
const https=require("https");
const Database=require("better-sqlite3");

const app=new Koa();
const router=new Router();
app.use(koaBody({
    multipart:true,//支持文件上传
    formidable:{
        uploadDir:path.join(__dirname,'./public/upload'),//设置上传文件由二进制数据转上传到服务器的存放目录，文件存储时会完成重新命名操作
        keepExtensions:true//设置是否保留上传文件的后缀名(默认是false)
    }
}));
// app.use(serve("./public"));
let staticPath=path.join(__dirname,'./public');
const db=new Database(path.join(__dirname,"./mini.sqlite"),{
    fileMustExist:true,
    verbose:console.log
});
app.use(serve(staticPath));

const httpRequestPromise=function(url=""){
    let p=new Promise(function(resolve,reject){
        https.get(url,function(res){
            res.on("data",resolve);//监听请求成功，并完成回调执行
            res.on("error",reject);//监听请求失败，并完成回调执行
        });
    });
    return p;
};

router.get("/test",async function(ctx){
    ctx.body="aaa";
});
router.post("/jscode2session",async function(ctx){
    console.log("==================");
    let code=ctx.request.body.code;
    let appID="wx4d521cf7b005ad43";
    let secret="2d499055f4d180ef3ddf69bb5f837bd8";
    let url=`https://api.weixin.qq.com/sns/jscode2session?appid=${appID}&secret=${secret}&js_code=${code}&grant_type=authorization_code`;
    //向微信服务器发送请求换区openid
    let resultBuffer=await httpRequestPromise(url);//返回二进制数据
    let wechatStr=resultBuffer.toString();//将二进制数据转换为字符串
    let openid=JSON.parse(wechatStr).openid;//将json字符串转换为对象,从对象中取出openid
    //基于openid查询用户在数据库中是否存在，如果存在则返回查询的用户信息,如果不存在则返回openid
    let sql=`
        select id,openId,phone,nickname,img 
        from 
        t_user 
        where openId=?
    `;
    let stmt=db.prepare(sql);
    
    let user=stmt.get(openid);
    if(user){
        ctx.body={
            user:user,
            openid:openid,
            isLogin:true
        }
    }else{
        ctx.body={
            openid:openid,
            isLogin:false
        }
    }

});

router.post("/loginAndRegist",async function(ctx){
    let params=ctx.request.body;//四个参数
    let sql=`
    select id,openId,phone,nickname,img 
    from 
    t_user 
    where openId=?
    `;  
    let stmt=db.prepare(sql);
    
    let user=stmt.get(params.openid);//先根据openid查询有没有该用户
    if(!user){
        let addSql=`insert into t_user ('openId','phone','nickname','img') values (?,?,?,?)`;
        db.prepare(addSql).run(params.openid,params.phone,params.nickname,params.img);
        user=db.prepare(sql).get(params.openid);//当数据插入到数据库之后立马根据openid重新查询该用户
    }
    ctx.body={
        isLogin:true,
        openid:params.openid,
        user:user
    };
});






//router是路由定义对象，用于提供定义时地址和回调函数之间的对应关系
// router完成关系定义后，由router.routes()方法执行完成路由表的生成
// 路由表->一段js的路由和方法对应的判断逻辑
app.use(router.routes());


app.listen(3000);